/**
 * 
 */
package com.xjt.common;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @author Jet Xu
 * 
 */
public class StringUtils
{
    /**
     * 判断字符串是否为null或空。
     * 
     * @param str
     * @return
     */
    public static boolean isBlank(String str)
    {
        return null == str || str.trim().length() == 0;
    }
    /**
     * 判断字符串是否不为null或空。
     * 
     * @param str
     * @return
     */
    public static boolean isNotBlank(String str)
    {
        return !isBlank(str);
    }

    /**
     * 判断字符串是否为null或空。
     * 
     * @param str
     * @return
     */
    public static boolean isEmpty(String str)
    {
        return null == str || str.isEmpty();
    }

    /**
     * 如果字符串为null，则返回“”
     * 
     * @param str
     * @return
     */
    public static String nullToEmpty(String str)
    {
        return null == str ? "" : str;
    }

    /**
     * 取得字符串的set方法名。
     * 
     * @param str
     * @return
     */
    public static String getSetMethodName(String str)
    {
        if (isEmpty(str))
        {
            return null;
        }

        return connectStrWithFirstCharUpper("set", str);
    }

    /**
     * 取得字符串的get方法名。
     * 
     * @param str
     * @return
     */
    public static String getGetMethodName(String str)
    {
        if (isEmpty(str))
        {
            return null;
        }

        return connectStrWithFirstCharUpper("get", str);
    }

    /**
     * 连接字符串，除了第一个字符串，其他的首字母大写
     * 
     * @param values
     * @return
     */
    public static String connectStrWithFirstCharUpper(String... values)
    {
        if (null == values || 0 == values.length || isEmpty(values[0]))
        {
            return null;
        }

        StringBuilder sBuilder = new StringBuilder();
        sBuilder.append(values[0]);

        for (int i = 1; i < values.length; i++)
        {
            if (isEmpty(values[i]))
            {
                continue;
            }
            sBuilder.append(values[i].substring(0, 1).toUpperCase());
            sBuilder.append(values[i].substring(1));
        }

        return sBuilder.toString();
    }

    /**
     * 是否匹配正则表达式
     * 
     * @param str 字符串
     * @param regex 正则表达式
     * @return
     */
    public static boolean isMatch(String str, String regex)
    {
        // 如果相等，则直接返回true
        if (str == regex)
        {
            return true;
        }

        boolean result = false;
        try
        {
            Pattern pattern = Pattern.compile(regex);
            Matcher matcher = pattern.matcher(str);
            result = matcher.matches();
        }
        catch (Throwable e)
        {
            result = false;
        }
        return result;
    }

    /**
     * 如果字符串长度小于len,则在左侧增加对应长度的字符
     * 
     * @param str 字符串
     * @param len 长度
     * @param chr 填充字符
     * @return
     */
    public static String padLeft(String str, int len, char chr)
    {
        StringBuilder sBuilder = new StringBuilder();

        // 去除null
        str = nullToEmpty(str);

        // 计算需要增加的字符数
        int idx = len - str.length();

        for (int i = 0; i < idx; i++)
        {
            sBuilder.append(chr);
        }

        sBuilder.append(str);

        return sBuilder.toString();
    }

    /**
     * 如果字符串长度小于len,则在右侧增加对应长度的字符
     * 
     * @param str 字符串
     * @param len 长度
     * @param chr 填充字符
     * @return
     */
    public static String padRight(String str, int len, char chr)
    {
        StringBuilder sBuilder = new StringBuilder();

        // 去除null
        str = nullToEmpty(str);

        // 计算需要增加的字符数
        int idx = len - str.length();

        sBuilder.append(str);

        for (int i = 0; i < idx; i++)
        {
            sBuilder.append(chr);
        }

        return sBuilder.toString();
    }

    /**
     * 截取过长的字符串，并加上后缀
     * 
     * @param str
     * @param len
     * @param suffix
     * @return
     */
    public static String subStringWithEnd(String str, int len, String suffix)
    {
        if (isEmpty(str))
        {
            return "";
        }

        suffix = nullToEmpty(suffix);

        if (str.length() <= len)
        {
            return str;
        }

        StringBuilder sBuilder = new StringBuilder();
        sBuilder.append(str.substring(0, len - suffix.length()));
        sBuilder.append(suffix);

        return sBuilder.toString();
    }

    public static String toHtml(String str)
    {
        return nullToEmpty(str).replaceAll("\r\n", "<br/>");
    }

    public static void main(String[] args)
    {
        System.out.println(subStringWithEnd("seaasfsdfaaaaaaaaaaaaaaaaaaaaaat", 10, "..."));
    }
}
